namespace CSharpPro._1106;
public class UserService : IUserService
{
    // 使用泛型集合保存注册用户信息
    private List<User> _users = new List<User>();
    
    // 登录实现
    public bool Login(string username, string password)
    {
        // 使用foreach循环迭代验证用户
        foreach (var user in _users)
        {
            if (user.Username == username && user.Password == password)
            {
                return true;
            }
        }
        return false;
    }
    
    // 注册实现
    public bool Register(string username, string password, string confirmPassword)
    {
        // 检查用户名是否已存在
        foreach (var user in _users)
        {
            if (user.Username == username)
            {
                Console.WriteLine("用户名已存在。");
                return false;
            }
        }
        
        // 验证密码是否一致
        if (password != confirmPassword)
        {
            Console.WriteLine("密码与确认密码不一致。");
            return false;
        }
        
        // 验证用户名和密码格式
        if (!IsValidUsername(username))
            return false;
            
        if (!IsValidPassword(password))
            return false;
        
        // 添加新用户
        _users.Add(new User(username, password));
        return true;
    }
    
    // 新增：删除用户实现（使用for循环，符合要求）
    public bool DeleteUser(string username, string password)
    {
        // 验证用户是否存在且密码正确
        for (int i = 0; i < _users.Count; i++)
        {
            if (_users[i].Username == username && _users[i].Password == password)
            {
                _users.RemoveAt(i);
                return true;
            }
        }
        return false;
    }
    
    // 新增：显示所有用户
    public void ShowAllUsers()
    {
        if (_users.Count == 0)
        {
            Console.WriteLine("没有注册的用户。");
            return;
        }
        
        Console.WriteLine("注册用户列表：");
        // 使用foreach循环显示所有用户
        foreach (var user in _users)
        {
            Console.WriteLine($"用户名：{user.Username}");
        }
    }
    
    // 运行主菜单（添加了删除用户的选项）
    public void RunMainMenu()
    {
        while (true)
        {
            Console.WriteLine("主菜单：1. 登录  2. 注册  3. 删除用户  4. 查看所有用户  5. 退出");
            if (int.TryParse(Console.ReadLine(), out int choice))
            {
                switch (choice)
                {
                    case 1:
                        HandleLogin();
                        break;
                    case 2:
                        HandleRegistration();
                        break;
                    case 3:  // 新增：删除用户选项
                        HandleDeleteUser();
                        break;
                    case 4:  // 新增：查看所有用户选项
                        ShowAllUsers();
                        break;
                    case 5:
                        return;
                    default:
                        Console.WriteLine("请输入有效数字。");
                        break;
                }
            }
            else
            {
                Console.WriteLine("请输入有效数字。");
            }
        }
    }
    
    // 处理登录逻辑
    private void HandleLogin()
    {
        Console.WriteLine("请输入用户名：");
        string username = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(username))
        {
            Console.WriteLine("用户名不可为空。");
            return;
        }

        Console.WriteLine("请输入密码：");
        string password = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(password))
        {
            Console.WriteLine("密码不可为空。");
            return;
        }

        if (Login(username, password))
        {
            Console.WriteLine("登录成功！进入系统首页（模拟）。");
        }
        else
        {
            Console.WriteLine("用户名不存在或密码错误。");
        }
    }
    
    // 处理注册逻辑
    private void HandleRegistration()
    {
        Console.WriteLine("请输入用户名（3 - 15个字符，只能包含字母、数字、下划线）：");
        string username = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(username))
        {
            Console.WriteLine("用户名不可为空。");
            return;
        }

        Console.WriteLine("请输入密码（6 - 20个字符，必须包含至少1个大写字母、1个小写字母和1个数字）：");
        string password = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(password))
        {
            Console.WriteLine("密码不可为空。");
            return;
        }

        Console.WriteLine("请确认密码：");
        string confirmPassword = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(confirmPassword))
        {
            Console.WriteLine("确认密码不可为空。");
            return;
        }

        if (Register(username, password, confirmPassword))
        {
            Console.WriteLine("注册成功！");
        }
    }
    
    // 新增：处理删除用户逻辑
    private void HandleDeleteUser()
    {
        Console.WriteLine("请输入要删除的用户名：");
        string username = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(username))
        {
            Console.WriteLine("用户名不可为空。");
            return;
        }

        Console.WriteLine("请输入该用户的密码：");
        string password = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(password))
        {
            Console.WriteLine("密码不可为空。");
            return;
        }

        if (DeleteUser(username, password))
        {
            Console.WriteLine("用户删除成功！");
        }
        else
        {
            Console.WriteLine("用户名不存在或密码错误，删除失败。");
        }
    }
    
    // 验证用户名格式
    public bool IsValidUsername(string username)
    {
        if (username.Length < 3 || username.Length > 15)
        {
            Console.WriteLine("用户名长度必须为3 - 15个字符。");
            return false;
        }

        foreach (char c in username)
        {
            if (!char.IsLetterOrDigit(c) && c != '_')
            {
                Console.WriteLine("用户名只能包含字母、数字、下划线。");
                return false;
            }
        }
        
        return true;
    }
    
    // 验证密码格式
    public bool IsValidPassword(string password)
    {
        if (password.Length < 6 || password.Length > 20)
        {
            Console.WriteLine("密码长度必须为6 - 20个字符。");
            return false;
        }

        bool hasUpper = false, hasLower = false, hasDigit = false;
        foreach (char c in password)
        {
            if (char.IsUpper(c)) hasUpper = true;
            if (char.IsLower(c)) hasLower = true;
            if (char.IsDigit(c)) hasDigit = true;
        }

        if (!hasUpper || !hasLower || !hasDigit)
        {
            Console.WriteLine("密码必须包含至少1个大写字母、1个小写字母和1个数字。");
            return false;
        }
        
        return true;
    }
}
